package model.contrainte;

import java.util.ArrayList;
import java.util.List;


import model.exception.ContrainteException;



public class ListeContrainte{
	
	private List<Contrainte> listeContraintes;	
	private CreateurContrainte createurContrainte;
	
	public ListeContrainte() {
		listeContraintes = new ArrayList<Contrainte>();		
		
	}
	/**
	 * Ajout d'une contrainte a listeContraites
	 * @param contrainte La contrainte à ajouter
	 * @throws ContrainteException si une Contrainte du meme type est deja presente dans listeContraintes
	 */
	public void ajouterContrainte(Contrainte contrainte) throws ContrainteException{
		try{
			getContrainteByType(contrainte.getTypeContrainte());
			throw new ContrainteException("Ajout impossible : une contrainte de ce type est deja pressente");
		}catch (ContrainteException e) {
			listeContraintes.add(contrainte);		
		}		
	}
	/**
	 * Ajout d'une contrainte dont le type n'est pas defini a listeContraites
	 * Appel du createurContrainte courant
	 * @param contenu de la contrainte, type non défini	 
	 * @throws ContrainteException si une Contrainte du meme type est deja presente dans listeContraintes
	 */
	public void ajouterContrainte(Object[] contenu) throws ContrainteException{
		Contrainte c = createurContrainte.creerContrainte(contenu);		
		ajouterContrainte(c);
	}
	/**
	 * @param contrainte La contrainte à supprimer
	 * @throws ContrainteException si aucune Aucune Contrainte du meme type trouvee
	 */
	public void supprimerContrainte(Contrainte contrainte) throws ContrainteException{
		try{
			getContrainteByType(contrainte.getTypeContrainte());
		}catch (ContrainteException e) {
			throw new ContrainteException("Suppresion impossible : Aucune contrainte de ce type");
		}		
		listeContraintes.remove(contrainte);
	}
	/**
	 * @return Contrainte du meme type que l'entree specifie
	 * @param typeContrainte le type de contrainte a rechercher
	 * @throws ContrainteException si aucune Aucune Contrainte du meme type trouvee
	 */
	public Contrainte getContrainteByType(TypeContrainte typeContrainte) throws ContrainteException{
		
		for(Contrainte c : listeContraintes){
			if(c.getTypeContrainte()==typeContrainte) return c;
		}		
		throw new ContrainteException("Aucune contrainte de ce type trouvee");
				
	}
	
	/**
	 * @return Booleen 
	 * @param cm Le ContrainteManager à comparer
	 */
	public boolean isEnAdequation(ListeContrainte cm){
		for(Contrainte c1 : listeContraintes){
			for(Contrainte c2 : cm.listeContraintes){
				if(c1.getTypeContrainte()==c2.getTypeContrainte()){
					if(!c1.isCompatible(c2)) return false;
				}
			}
		}
		return true;
	}	
	
	/**
	 * @param listeContraintes the listeContraintes to set
	 */
	public void setListeContraintes(List<Contrainte> listeContraintes) {
		this.listeContraintes = listeContraintes;
	}

	/**
	 * @return the listeContraintes
	 */
	public List<Contrainte> getListeContraintes() {
		return listeContraintes;
	}	
	
	/**
	 * @param createurContrainte the createurContrainte to set
	 */
	public void setCreateurContraite(CreateurContrainte createurContrainte) {
		this.createurContrainte = createurContrainte;
	}

	/**
	 * @return the createurContrainte
	 */
	public CreateurContrainte getCreateurContrainte() {
		return createurContrainte;
	}
	
}
